<?php

/*
 * Подключение к базе данных
 * Используется PDO
 */

namespace T4\DB;

use \T4\Exception;
use T4\DB\Statement;

class Connection extends \PDO {

	/**
	 *
	 * @var \T4\Config Конфиг соединения с базой
	 */
	protected $config;

	/**
	 * Стейтмент
	 * @var PDOStatement 
	 */
	protected $statement;

	/**
	 * Создание соединения с БД
	 * @param \T4\Config $config конфигурация соединения
	 * @return \T4\DB\Connection соединение с базой
	 */
	public function __construct($connection = 'default') {

		$config = \T4\Config::getInstance(\ROOT_PATH . '/config/common.yaml');
		$this->config = $config->database->{$connection};

		if ('mysql' != $this->config->adapter)
			throw new Exception('Поддерживается только база данных MySQL');

		try {

			$dsn = $this->config->adapter . ':host=' . $this->config->host . ';dbname=' . $this->config->dbname . '';
			parent::__construct(
					$dsn, $this->config->user, $this->config->password, array(\PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8')
			);
			$this->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
			
		} catch (\PDOException $e) {

			throw new Exception('Ошибка подключения к базе данных: ' . $e->getMessage());
		}

		return $this;
		
	}

	/**
	 * Переопределяем методы PDOStatement для реализации цепочек вызовов
	 */
	public function prepare($statement, $driver_options = array()) {
		$this->statement = new Statement( parent::prepare($statement, $driver_options) );
		return $this;
	}

	public function execute($inputParams = array()) {
		try {
			$this->statement->execute($inputParams);
		} catch (\PDOException $e) {
			throw new Exception('Ошибка выполнения запроса [' . $this->statement->getQueryString() . ']: ' . $e->getMessage());
		}
		return $this;
	}

	public function fetch($fetch_style = self::FETCH_BOTH) {
		return $this->statement->fetch($fetch_style);
	}

	public function fetchAll($fetch_style = self::FETCH_BOTH) {
		return $this->statement->fetchAll($fetch_style);
	}

	public function columnCount() {
		return $this->statement->columnCount();
	}

}